package javaEEBasic.day01;

public class DecimalToBinary {
    public static void main(String[] args) {
        System.out.println("int可以表示的最小负数");
        System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));
        System.out.println("------------------");
        int number = 42; // 示例十进制数

        // 方法1：使用内置方法
        String binary1 = Integer.toBinaryString(number);
        System.out.println("方法1：使用 Integer.toBinaryString()");
        System.out.println("十进制数 " + number + " 的二进制表示是：" + binary1);

        // 方法2：手动实现转换
        String binary2 = convertToBinary(number);
        System.out.println("\n方法2：手动实现转换逻辑");
        System.out.println("十进制数 " + number + " 的二进制表示是：" + binary2);

        System.out.println("----------测试负数的情况-----------");
        int negativeNumber = -42;
        String binary3 = Integer. toBinaryString(negativeNumber);
        System.out.println("十进制数" + negativeNumber + "的二进制表示是：" + binary3);
        String binary4 = convertToBinary(negativeNumber);
        System.out.println("\n测试负数（-42）的二进制补码表示：");
        System.out.println("十进制数 " + negativeNumber + " 的二进制表示是：" + binary4);
    }

    /**
     * 手动将十进制整数转换为32位二进制字符串
     * @param num 十进制整数
     * @return 32位二进制字符串
     */
    public static String convertToBinary(int num) {
        StringBuilder sb = new StringBuilder();

        // 直接处理32位
        for (int i = 31; i >= 0; i--) {
            // 获取第i位的值（0或1）
            /**
             * 位移操作：num >> i 将第 i 位移到最低位。
             * 作用：将二进制数 num 向右移动 i 位，最右边的 i 位被丢弃，
             * 左边空出的位根据符号位填充（正数补 0，负数补 1）。
             * 关键：& 1 可以提取一个数的最低位（判断奇偶性就是用这个原理）。 4&1 -->0 表示是偶数
             * 掩码 & 1：获取最低位的值（0 或 1）。
             * 作用：将一个数与 1（二进制为 0001）进行按位与运算，仅保留最低位，其他位全部置为 0。
             * 0 & 0 = 0
             * 0 & 1 = 0
             * 1 & 0 = 0
             * 1 & 1 = 1
             * 这两个操作结合起来，可以提取 num 的第 i 位的值：
             * 右移 i 位：将第 i 位移到最低位。
             * 与 1 按位与：只保留最低位，得到第 i 位的原始值（0 或 1）。
             */
            int bit = (num >> i) & 1;
            sb.append(bit);

            // 每4位添加一个空格，提高可读性
            if (i % 4 == 0 && i != 0) {
                sb.append(" ");
            }
        }

        return sb.toString();
    }
}